<?php
include_once 'Retriever.php';
include_once '../Model/BusAtStop.php';
include_once '../Model/BusLine.php';
include_once '../Utility/simplehtmldom/simple_html_dom.php';
include_once '../Exceptions/CommunicationException.php';
include_once '../Exceptions/WrongParametersException.php';
include_once '../AtacAPI/BikeSharing.php';

class ACBikesStatus extends Retriever {
	
	private static $SERVICE_NAME = 'bike';
	private static $PLUS = '+';
	private static $SEPARATOR = '&';
	private static $ATAC_URL = 'http://muovi.roma.it/?';
	
	
	private static $NAV = '2';

	private $stationName;
	private $freeBikes;
	private $totalBikes;

	private $stations;
	private $atacStations;
	
	function __construct($stations) {
		$this->stations = $stations;
		
	}
	
	
	function retrieveBikesStatus_NEW()
	{
                $bike_req = new BikeSharing();
                try {
                        $bikes_out = $bike_req->getBike();
                }catch(Exception $e)
                {
                        throw new CommunicationException ("ACBikeStatus: Service Not Available", 0);
                        return null;
                }
		$stations = array();
                foreach($this->stations as $bike)
                {
                        foreach($bikes_out as $bike_info)
                        {
                                if($bike_info->getNome()== $bike->getStationName())
                                {
                                        if($bike_info->isValido() == 1)
					{
                                                $bike->setTotalBikes($bike_info->getBiciTotali());
                                                $bike->setFreeBikes($bike_info->getBiciDisponibili());
						array_push($stations, $bike);

					}
                                }
                        }
                }
		return $stations;

	}
	
	/*
	Funzione che ritona in caso di errore una lista vuota, in caso di successo un elenco
        composto da tutte le stazioni di bike sharing vicine ad una posizione stabilita dall'utente,
        tali informazioni sono:nome, via,bici rimanenti, bici totali, e coordinate.
	 */
	function retrieveBikesStatus() {
		
		$stations = array();
		
		//do all'oggetto i parametri relativi al nome del servizio che nel
                //nostro caso � bike e 2.

		$this->params = array(
			'service'=> ACBikesStatus::$SERVICE_NAME,
			'nav'=> ACBikesStatus::$NAV
		);

    //prendo l'url predefinto relativo al servizio di bike sharing.
		//$url= ACBikesStatus::$ATAC_URL;
		//foreach($this->params as $key => $value)
			//$url = $url."&".$key."=".$value;
		$url="http://muovi.roma.it/bike/";

                //carico nella variabile page l'intera pagina html fornita da Atac
		$page = $this->getHTMLPageFromURL($url);
		
		if ($page==false)
		{
			//throw new CommunicationException ("ACBikesStatus: No Response from ATAC", 0);
			//Se non e' possibile caricare la pagina, la funzione ritorna null.
			return null;
		}

                //trasformo la stringa in un oggetto html dom.
		$html = str_get_html($page);
		
		//estraggo solo il testo dall'oggetto html dom.
		$text = $html->plaintext;

                //preparo le variabli er la segnalazione di un eventuale disservizio.
		$pos = strpos($text,"servizio");
		$pos2 = strpos($text,"attivo");
		$pos3 = strpos($text,"non");

		//Il problema riguarda l'intero servizio
		if(($pos != false) && ($pos2!=false) && ($pos3!=false)) {
 			throw new CommunicationException ("ACBikesStatus: No Response from ATAC", 0);
			return null;
		}
		
		//Il problema riguarda solo quella richiesta
		if ((strpos($text, "tecnici")!=false) && ((strpos($text, "problemi")!=false))) {
			//throw new CommunicationException ("ACBikesStatus: Service Not Available", 0);
			return null;
		}

		//Trova il primo <p> nel  <div> con classe main e ne salva il contenuto fino al tag di chiusura </p> dentro $element.
		foreach ($html->find('div[id=main]/p') as $ret0) {
                        //se non ho trovato niente:
			if ($ret0 == null)
			{
				//Libero la memoria e rendo null
				unset($ret0);
				$html->clear();
				unset($html);
				
				return null;
			}
		}

		//Con explode trasformo il contenuto nella variabile $dati in un vettore,
                //tramite il separatore di fine tag <br>.
		$dati = explode ('<br />', $ret0->outertext);
		$atacStations = array();
		
		for($i=0;$i<count($dati);$i++){ 
			//La funzione strip_tags, elimina i tag html in una stringa.
			$dati[$i] = strip_tags ($dati[$i]); 
			//Infine con explode tramite il separatore ':' trasformo il vettore in matrice.
			$dati[$i] = explode ( ':' , $dati[$i] );
            //Con la funzione trim elimino gli spazi vuoti.
            
			$stationName = trim ($dati[$i][0]);
			
			//Aggiungamo una terza dimensione alla matrice tramite il separatore 'su'.
			$dati[$i][1] = explode ("su",$dati[$i][1]);
			$freeBikes = trim ($dati[$i][1][0]);
			$totalBikes = trim ($dati[$i][1][1]);
			
			$atacStations[$stationName] = array (
            	'freeBikes'=>$freeBikes,
				'totalBikes'=>$totalBikes,
            );
			
		}
		//per ogni punto di bike sharing:
		foreach ($this->stations as $station)
		{
			
			$atacStation = $atacStations[$station->getStationName()];
			
			if ($atacStation!==null) {
				$station->setFreeBikes($atacStation["freeBikes"]);
				$station->setTotalBikes($atacStation["totalBikes"]);
			}

			//lo inserisco nel vettore.
			array_push($stations, $station);
		}
		//rilascio le risorse.
		$html->clear();
		unset($html);

		return $stations;
			
	}

}

?>
